'use strict';

const { Service } = require('egg');
const ModelName = 'Vote'
class RouterService extends Service {
  /**
   * 根据分页和搜索条件获取
   * @param {Object} where 查询用户的条件
   * @param {Number} page 当前分页
   * @param {Number} pageSize 当前页每页多少条
   */
  async getPage(where, page, pageSize) {
    return this.ctx.model[ModelName].findAndCountAll({
      where,
      offset: pageSize * (page - 1),
      limit: pageSize,
      order:[
        // id 降序
        ['create_time','DESC']
      ],
      include: [
        {
          model: this.ctx.model.Group,
          as: 'group',
        },
        {
          model: this.ctx.model.User,
          as: 'user',
        }
      ]
    });
  }

  // 所有列表
  async allList() {
    return this.ctx.model[ModelName].findAll({
      order:[
        // id 降序
        ['create_time','DESC']
      ],
    });
  }
  async findOne(id) {
    return this.ctx.model[ModelName].findOne({
      where: {
        id,
      },
    });
  }

  /**
   * 创建
   * @param {*} data 角色信息
   */
  async create(data) {
    const {
      user_id,
      group_id,
      password
    } = data;
    if (!user_id) {
      throw new Error('投票人不存在');
    }
    if (!group_id) {
      throw new Error('投票对象不存在');
    }
    if (!password) {
      throw new Error('投票码不能为空');
    }
    const group = await this.ctx.model.Group.findByPk(group_id);
    if (!group) {
      throw new Error('投票对象不存在');
    }
    if (group.password !== password) {
      throw new Error('投票码有误');
    }
    // 创建投票，先获取配置表
    const configList = await this.ctx.model.Config.findAll()
    let voteConfig = configList.find(item => item.code === 'vote')
    if (!voteConfig) {
      throw new Error('请先配置投票规则');
    }
    let startTime = configList.find(item => item.code === 'start_time')
    let endTime = configList.find(item => item.code === 'end_time')
    if (startTime && endTime) {
      // 当前时间小于开始时间，提示未开始
        if (new Date() < new Date(startTime.value)) {
            throw new Error('投票未开始');
        }
        // 当前时间大于结束时间，提示已结束
        if (new Date() > new Date(endTime.value)) {
            throw new Error('投票已结束');
        }
    }
    // value字段为每日最大投票数
    const voteCount = await this.ctx.model[ModelName].count({
      where: {
        user_id: data.user_id,
       // create_time 等于当天
        create_time: {
          [this.app.Sequelize.Op.gte]: new Date(new Date().toLocaleDateString()),
          [this.app.Sequelize.Op.lt]: new Date(new Date().toLocaleDateString() + ' 23:59:59')
        }
      }
    })
    console.log('voteCount',voteCount)
    if (voteCount >= voteConfig.value) {
      throw new Error('今日投票次数已用完');
    }
    // 创建投票
    return this.ctx.model[ModelName].create(data);
  }

  /**
   * 根据ID修改
   * @param {Number} id ID
   * @param {Object} data 要修改的信息
   */
  async update(id, data) {
    return await this.ctx.model[ModelName].update(data, { where: { id } });
  }

  /**
   * 根据id删除
   * @param {Number}
   */
  async deleteById(id) {
    return await this.ctx.model[ModelName].destroy({ where: { id } });
  }
}

module.exports = RouterService;
